package list;

import java.util.Arrays;

public class MyArrayList{
    private String[] strList; //创建引用的变量
    private int usedSize;  //控制有效数据

    // 用构造方法创建String[]对象，可以先给一个定长的String类型数组，空间不够再扩容
    public MyArrayList(){
        this.strList = new String[2];
        this.usedSize = 0;
    }

    // 打印顺序表
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.strList[i] + " ");
        }
    }

    // 添加数据时检查是否满，顺序表满了则扩容
    public void checkStrListSpace() {
        if(this.usedSize >= this.strList.length){
            int oldLength = this.strList.length;
            int newLength = oldLength * 2;
            this.strList = Arrays.copyOf(this.strList,newLength);
        }
    }

    // 新增元素,默认在数组最后新增
    public void add(String data) {
        checkStrListSpace();
        this.strList[this.usedSize] = data;
        this.usedSize++;
    }

    // 在 pos 位置新增元素
    public void add(int pos, String data) {
        //1、检查下标的合法性
        if(pos<1 || pos> this.usedSize + 1){
            throw new IndexIllegalException("位置不合法");
        }
        //2、检查顺序表是否满，满则扩容
        checkStrListSpace();
        for (int i = this.usedSize-1; i >= pos-1; i--) {
            this.strList[i+1] = this.strList[i];
        }
        //3、放入数据
        this.strList[pos-1] = data;
        //4、有效数据+1
        this.usedSize++;
    }

    // 判断是否包含toFind这个字符串
    public boolean contains(String toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.strList[i].equals(toFind)){
                return true;
            }
        }
        return false;
    }

    // 查找某个元素对应的位置
    public int indexOf(String toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.strList[i].equals(toFind)){
                return i;
            }
        }
        return -1;
    }

    // 获取 第pos 位置的元素
    public String get(int pos) {
        //1、判断顺序表是否为空，空则抛出异常
        if(this.usedSize == 0) {
            throw new EmptyArrayListException("顺序表为空！");
        }
        //2、判断给出的第pos位置是否合法
        if(pos<1 || pos> this.usedSize){
            throw new IndexIllegalException("位置不合法！");
        }
        //3、取出第pos个，即pos-1下标的数据
        return this.strList[pos-1];
    }

    // 给 pos 位置的元素设为 value
    public void set(int pos, String value) {
        //1、判断顺序表是否为空，为空则抛出异常
        if(this.usedSize == 0) {
            throw new EmptyArrayListException("顺序表为空！");
        }
        //2、判断给出的下标是否合法，不合法则抛出异常
        if(pos<1 || pos> this.usedSize){
            throw new IndexIllegalException("位置不合法！");
        }
        //3、修改数据
        this.strList[pos-1] = value;
    }

    // 删除第一次出现的关键字key
    public void remove(String toRemove) {
        //1、判断顺序表是否为空
        if(this.usedSize == 0)
        {
            throw new EmptyArrayListException("顺序表为空！");
        }
        //2、判断顺序表中是否有这个数据
        int index = -1;
        for (int i = 0; i < this.usedSize; i++) {
            if(this.strList[i].equals(toRemove)) {
                index = i;
                break;
            }
        }

        //3、有这个数据则，删除该数据
        if(index != -1) {
            for (int i = index+1; i < this.usedSize; i++) {
                this.strList[i-1] = this.strList[i];
                this.strList[i] = null;
            }
            this.usedSize--;
        }

        //4、走到这里说明index=-1，所以顺序表中，没有该数据，无法删除
        throw new NoneCurrentDataException("顺序表中没有该数据！");
    }

    // 获取顺序表长度
    public int size() {
        return this.usedSize;
    }

    // 清空顺序表
    public void clear() {
        while (this.usedSize > 0){
            this.strList[--this.usedSize] = null;
        }
    }
}
